// HTTP请求封装
import { getToken, clearAuth, getUserInfo } from './auth.js'
import apiConfig from '@/config/api.js'

/**
 * 发起HTTP请求
 */
export function request(options) {
	return new Promise((resolve, reject) => {
		// 获取token
		const token = getToken()
		
		// 获取用户信息
		const userInfo = getUserInfo()
		
		// 处理参数
		let requestData = {}
		let requestUrl = apiConfig.baseUrl + options.url
		
		if (options.params) {
			// 如果有params，将其作为查询参数添加到URL中
			const queryParams = []
			Object.keys(options.params).forEach(key => {
				if (options.params[key] !== undefined && options.params[key] !== null) {
					queryParams.push(encodeURIComponent(key) + '=' + encodeURIComponent(options.params[key]))
				}
			})
			if (queryParams.length > 0) {
				requestUrl += '?' + queryParams.join('&')
			}
		}
		
		if (options.data) {
			requestData = options.data
		}
		
		// 构建请求头
		const headers = {
			'Content-Type': 'application/json',
			'Authorization': token ? `Bearer ${token}` : '',
			...options.header
		}
		
		// 添加用户名到请求头（用于后端识别当前用户，用于流程审批）
		if (userInfo && userInfo.username) {
			headers['X-User-Name'] = userInfo.username
		}
		
		uni.request({
			url: requestUrl,
			method: options.method || 'GET',
			data: requestData,
			header: headers,
			success: (res) => {
				if (res.statusCode === 200) {
					// 请求成功
					// 兼容Java后端的响应格式 (code: 200) 和Python后端的响应格式 (success: true)
					if (res.data.code === 200 || res.data.success === true) {
						resolve(res.data)
					} else {
						// 业务错误
						const errorMessage = res.data.message || res.data.msg || '请求失败'
						uni.showToast({
							title: errorMessage,
							icon: 'none'
						})
						reject(res.data)
					}
				} else if (res.statusCode === 401) {
					// token过期或未登录
					uni.showToast({
						title: '登录已过期，请重新登录',
						icon: 'none'
					})
					clearAuth()
					uni.reLaunch({
						url: '/pages/login/login'
					})
					reject(res.data)
				} else {
					// 其他错误
					const errorMessage = res.data.message || res.data.msg || '请求失败'
					uni.showToast({
						title: errorMessage,
						icon: 'none'
					})
					reject(res.data)
				}
			},
			fail: (err) => {
				uni.showToast({
					title: '网络请求失败',
					icon: 'none'
				})
				reject(err)
			}
		})
	})
}

